package com.fafu.mq.common;

import java.io.*;

//下列的逻辑, Java的其他对象也可以通过这个逻辑进行序列化和反序列化
//如果想要这个对象能够进行序列化或者反序列化, 需要让这个类实现这个 Serializable 接口
//实现这个接口(仅仅是 Java 标准库的要求)
public class BinaryTool {
    //把一个对象序列化成字节数组
    public static byte[] toBytes(Object object) throws IOException {
        //这个流就是一个可变的字节数组, 可以关闭也可以不关闭
        //将 object 序列化后的数据 全部写入 byteArrayOutputStream 中再转化成字节数组
        try(ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream()){
            try (ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream)){
                //此处的 objectOutputStream 就会将 object 进行序列化操作
                //全部写入 byteArrayOutputStream
                objectOutputStream.writeObject(object);
            }
            //这个操作就是将字节流里面的数据转化成了字节数组
            return byteArrayOutputStream.toByteArray();
        }
    }

    //把一个字节数组反序列化成一个对象
    public static Object fromBytes(byte[] data) throws IOException, ClassNotFoundException {
        Object object = null;
        try (ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(data)){
            try (ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream)){
                //从 data 这个字节数组中去读, 并进行反序列化操作
                object = objectInputStream.readObject();
            }
        }
        return object;
    }
}
